package cc.itez.wx.linkman.controller;

import cn.hutool.crypto.digest.DigestUtil;
import cc.itez.wx.linkman.config.WxProfile;
import cc.itez.wx.linkman.mould.WxMessage;
import cc.itez.wx.linkman.service.MessageService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping("/wx")
public class WxController {
    @Autowired
    private WxProfile profile;
    @Autowired
    private MessageService messageService;

    @GetMapping
    public String verify(String signature, String timestamp, String nonce, String echostr) {
        if (StringUtils.isNoneEmpty(signature, timestamp, nonce, echostr)) {/*
        开发者提交信息后，微信服务器将发送GET请求到填写的服务器地址URL上，GET请求携带参数如下表所示：
        参数	描述
        signature	微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        timestamp	时间戳
        nonce	随机数
        echostr	随机字符串
        开发者通过检验signature对请求进行校验（下面有校验方式）。若确认此次GET请求来自微信服务器，请原样返回echostr参数内容，则接入生效，成为开发者成功，否则接入失败。加密/校验流程如下：
        1）将token、timestamp、nonce三个参数进行字典序排序
        2）将三个参数字符串拼接成一个字符串进行sha1加密
        3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
         */
            String[] args = new String[]{timestamp, nonce, profile.getToken()};
            Arrays.sort(args);
            String join = StringUtils.join(args, "");
            String signature01 = DigestUtil.sha1Hex(join);
            if (Objects.equals(signature01, signature)) {
                return echostr;
            }
        }
        return "hello!";
    }

    @PostMapping
    public String receiveMessages(@RequestBody String xml) {
        System.out.println(xml);
        WxMessage msg = WxMessage.load(xml);
        if (msg != null) {
            System.out.println(msg);
            String reply = messageService.handler(msg);
            System.out.println(reply);
            return reply;
        }
        return "";
    }
}
